#Regular Expression 正则表达式
#1、search函数
    #search('正则表达式','字符串')  按照正则表达式去匹配字符串
    #如果可以匹配上就返回匹配的对象
    #如果匹配不上就返回None
# import re
# s='abcdefg'
# result = re.search('cde',s)
# print(result)
# result = re.search('edc',s)
# print(result)
import re

#2、可以利用search函数的结果来判断有没有匹配到内容
# import re
# x = input("你输入1个数字：")
# s = '0123456789'
# result = re.search(f'{x}',s)
# if result!=None:
#     print(f'{x}是1个数字')
# else:
#     print(f'{x}不是1个数字')

#3、正则表达式的格式符
#[0-9]  代表匹配1个任意数字
#[a-z]  代表匹配1个任意小写字母
#[a-z|A-Z]  #代表匹配1个任意字母
#.      代表匹配1个任意字符
#案例1、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是1个任意字符的内容
# import re
# def f1(s):
#     result=re.search('b.d',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('abcdefg')
# f1('123123123b1d12123123')
# f1('b d')
# f1('b13d')

#{n}    代表前面的字符匹配n次
        #.{5}       代表匹配5个任意字符
        #[0-9]{5}   代表匹配5个任意数字
#案例2、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是5个任意字符的内容
# import re
# def f1(s):
#     result=re.search('b.{5}d',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('b12345d')
# f1('b1234d')
# f1('b123456d')

#{m,n}      代表前面的字符匹配m到n次
        #.{1,3}     代表匹配1到3个任意字符
        #[a-z]{3,5} 代表匹配3到5个任意小写字母
#案例3、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是4-6个任意字符的内容
# import re
# def f1(s):
#     result=re.search('b.{4,6}d',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('b123d')
# f1('b1234d')
# f1('b12345d')
# f1('b123456d')
# f1('b1234567d')

#+      代表匹配1或n次
    #.+     代表匹配任意长度的任意非空字符
#*      代表匹配0或n次
    #.*     代表匹配任意长度的任意字符，可以是空字符串
#案例4.1、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是任意个(不能是0个)任意字符的内容
# import re
# def f1(s):
#     result=re.search('b.+d',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('bd')
# f1('b1d')
# f1('b11234567890234567890123456789234567890d')
#案例4.2、编写一个函数f1，接受字符串s
#判断字符串s中有没有，b开头，d结尾，中间是任意个(可以是0个)任意字符的内容
# import re
# def f1(s):
#     result=re.search('b.*d',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('bd')
# f1('b1d')
# f1('b11234567890234567890123456789234567890d')

#\A表示字符串开始
#\Z表示字符串结尾
#案例5、编写一个函数f1，接受字符串s
#判断字符串s中是否符合以下规则，第1个字母是b，最后1个字母是d，中间是任意个(可以是0个)任意字符的内容
# import re
# def f1(s):
#     result=re.search('\Ab.*d\Z',s)
#     if result!=None:
#         print('匹配到了')
#     else:
#         print('没有匹配到')
# f1('123b2d')
# f1('b2d')
# f1('b2d123')

#4、group函数，获取匹配到的结果
# s='{"empno":"7839","ename":"smith","job":"clerk"}'
# result=re.search('"empno":"(.*)","ename":"(.*)","job":"(.*)"',s)
# print(result.group(0))          #group(0)   返回整段匹配的字符串
# print(result.group(1))          #group(1)   返回第1个括号
# print(result.group(2))          #group(2)   返回第2个括号
# print(result.group(3))          #group(3)   返回第3个括号
# print(result.group(4))          #报错，没有第4个括号

#5、?表示非贪婪模式，匹配最短字符串
    #正则表达式默认匹配最长字符串
    #加上?，就匹配最短字符串
# s='abcdabcdabcd'
# result = re.search('a(.*)c',s)
# print(result.group(0))

# s='abcdabcdabcd'
# result = re.search('a(.*?)c',s)
# print(result.group(0))

#实用案例：写一个函数get_str_by_re，接受3个参数left,right,string
    #返回结果是从string中匹配 左边是left，右边是right，中间是任意内容的字符串
    #string='abcdefgabcd' left='b' right='d' ，返回 'c'
    #string='abcdefgabcd' left=没有 right='d'，返回'abc'
    #string='abcdefgabcd' left='d' right=没有，返回'efgabcd'
import re
#正则表达式提取器
def get_str_by_re(left='\A',right='\Z',string=''):
    result = re.search(f'{left}(.*?){right}',string)
    if result !=None:
        return result.group(1)
    else:
        return '没有找到相匹配的内容'

print(get_str_by_re(left='b',right='d',string='abcdefgabcd'))
print(get_str_by_re(right='d',string='abcdefgabcd'))
print(get_str_by_re(left='b',string='abcdefgabcd'))
print(get_str_by_re(left='a',right='z',string='abcdefgabcd'))




